package com.bawei.module_attendance

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.alibaba.android.arouter.facade.annotation.Route
import com.baidu.location.BDAbstractLocationListener
import com.baidu.location.BDLocation
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.CoordType
import com.baidu.mapapi.SDKInitializer
import com.baidu.mapapi.model.LatLng
import com.baidu.mapapi.utils.DistanceUtil
import com.bawei.library_base.BaseApplication
import com.bawei.library_mvi.ui.BaseMviActivity
import com.bawei.module_attendance.databinding.AttendanceActivitySignBinding
import com.bawei.module_attendance.entity.RequestEntity
import com.blankj.utilcode.util.TimeUtils
import com.bw.attendance.sign.SignAdapter
import com.bw.attendance.sign.SignViewModel
import kotlinx.coroutines.launch
@Route(path = "/attendance/signactivity")
class MainActivity : BaseMviActivity<AttendanceActivitySignBinding>() {
    private lateinit var mLocationClient : LocationClient
    private val myListener = MyLocationListener()
    private lateinit var addressStr : String
    private var lat :Double=0.0
    private var longitude :Double=0.0
    private lateinit var adapter: SignAdapter
    private lateinit var viewModel: SignViewModel

    // 创建指定地点的经纬度：公司的地址
    var targetLatLng = LatLng(23.4567, 45.6789)



    override fun initView() {
        initLocation()
        viewDataBinding.signBtn.text = "签到"
        viewDataBinding.signBar.titleTv.text = "考勤"
        viewDataBinding.signDateTv.text = "时间"+ TimeUtils.getChineseWeek(System.currentTimeMillis())
        viewDataBinding.signBar.backImg.setOnClickListener { finish() }
        viewDataBinding.signBtn.setOnClickListener {
            //签到前计算位置是否在1公里范围内
//            val distance = DistanceUtil.getDistance(targetLatLng, LatLng(lat, longitude))
//            if(distance > 1000){
//                showMsg("不在一公里范围内不能签到")
//                return@setOnClickListener
//            }
            //签到
            lifecycleScope.launch{
                viewModel.intents.send(SignIntent.RequestSignIntent(RequestEntity(1,lat,longitude)))
            }
        }
        val manager = LinearLayoutManager(this)
        manager.orientation = LinearLayoutManager.VERTICAL
        viewDataBinding.signRv.layoutManager = manager
//        viewDataBinding.signRv.addItemDecoration(SignLineDecoration(this))
        adapter = SignAdapter()
        viewDataBinding.signRv.adapter= adapter
    }
    //查看所有的签到数据
    override fun initData() {
        lifecycleScope.launch{
            viewModel.intents.send(SignIntent.RequestSignHistoryIntent(RequestEntity(1,1)))
        }
    }

    //使用百度地图定位功能
    private fun initLocation(){
        mLocationClient =  LocationClient(getApplicationContext())
        //声明LocationClient类
        mLocationClient!!.registerLocationListener(myListener)
        val option : LocationClientOption =  LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
        //可选，设置定位模式，默认高精度
        //LocationMode.Hight_Accuracy：高精度；
        //LocationMode. Battery_Saving：低功耗；
        //LocationMode. Device_Sensors：仅使用设备；
        //LocationMode.Fuzzy_Locating, 模糊定位模式；v9.2.8版本开始支持，可以降低API的调用频率，但同时也会降低定位精度；
        option.setCoorType("bd09ll");
        //可选，设置返回经纬度坐标类型，默认GCJ02
        //GCJ02：国测局坐标；
        //BD09ll：百度经纬度坐标；
        //BD09：百度墨卡托坐标；
        //海外地区定位，无需设置坐标类型，统一返回WGS84类型坐标
        option.setScanSpan(1000)
//可选，设置发起定位请求的间隔，int类型，单位ms
//如果设置为0，则代表单次定位，即仅定位一次，默认为0
//如果设置非0，需设置1000ms以上才有效
//可选，设置是否使用卫星定位，默认false
//使用高精度和仅用设备两种定位模式的，参数必须设置为true
        option.setIgnoreKillProcess(false);
//可选，定位SDK内部是一个service，并放到了独立进程。
//设置是否在stop的时候杀死这个进程，默认（建议）不杀死，即setIgnoreKillProcess(true)
        option.SetIgnoreCacheException(false);
//可选，设置是否收集Crash信息，默认收集，即参数为false
        option.setWifiCacheTimeOut(5*60*1000);
//可选，V7.2版本新增能力
//如果设置了该接口，首次启动定位时，会先判断当前Wi-Fi是否超出有效期，若超出有效期，会先重新扫描Wi-Fi，然后定位
//        option.setEnableSimulateGnss(false);
//可选，设置是否需要过滤卫星定位仿真结果，默认需要，即参数为false
        option.setNeedNewVersionRgc(true);
//可选，设置是否需要最新版本的地址信息。默认需要，即参数为true
        mLocationClient!!.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象，通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置，请参照类参考中LocationClientOption类的详细说明
        mLocationClient!!.start()
    }

    override fun onStop() {
        super.onStop()
        mLocationClient!!.stop()
    }



    override fun handleState() {
        lifecycleScope.launch {
            viewModel.states.collect{
                when(it){
                    is SignState.RequestSignSuccessState ->{
                        showMsg("签到成功")
                    }
                    is SignState.Init->{}
                    is SignState.RequestHistorySignSuccessState ->{
                        adapter.setNewInstance(it.data)
                    }
                }
            }
        }
    }


    inner class MyLocationListener : BDAbstractLocationListener(){
        override fun onReceiveLocation(location: BDLocation?) {
            if (location == null)
                mLocationClient.start()
            if (location!!.locType == 167){
                addressStr = "天津"
                return
            }
            addressStr = location.address.address
            lat = location.latitude
            longitude = location.longitude
        }

    }


    override fun generateViewModel() {
        viewModel = ViewModelProvider(this).get(SignViewModel::class.java)
    }
    override fun getLayout(): Int {
        return R.layout.attendance_activity_sign
    }



}